home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et3_0-a1.lha / et3 / src / Region.C < prev    next >
C/C++ Source or Header  |  1992-06-16  |  2KB  |  107 lines

  1. #ifdef __GNUG__
  2. #pragma implementation
  3. #endif
  4.  
  5. #include "Region.h"
  6.  
  7. #include "Class.h"
  8. #include "Storage.h"
  9. #include "String.h"
  10.  
  11. #define SIMPLE
  12.  
  13. //---- Region ------------------------------------------------------------------
  14.  
  15. Region::Region()
  16. {
  17.     size= 0;
  18.     rl= 0;
  19.     bbox= gRect0;
  20.     
  21. #ifdef SIMPLE
  22.     rl= (Rectangle*)Storage::Alloc(sizeof(Rectangle)*25);
  23. #endif
  24. }
  25.  
  26. Region::Region(Rectangle &r)
  27. {
  28.     size= 1;
  29.     rl= (Rectangle*) Storage::Alloc(sizeof(Rectangle)*size);
  30.     rl[0]= r;
  31.     bbox= r;
  32. }
  33.  
  34. Region::~Region()
  35. {
  36.     size= 0;
  37.     SafeDelete(rl);
  38. }
  39.  
  40. Rectangle *Region::GetAt(int ix)
  41. {
  42.     if (ix >= 0 && ix < size)
  43.     return &rl[ix];
  44.     return 0;
  45. }
  46.  
  47. void Region::operator=(Region &r)
  48. {
  49.     SafeDelete(rl);
  50.     size= r.size;
  51.     bbox= r.bbox;
  52.     rl= (Rectangle*) Storage::Alloc(sizeof(Rectangle)*size);
  53.     memcpy(rl, r.rl, sizeof(Rectangle)*size);
  54. }
  55.  
  56. void Region::Merge(Rectangle r)
  57. {
  58. #ifndef SIMPLE
  59.     if (size > 0) {
  60.     Rectangle *nrl= (Rectangle*) Alloca(sizeof(Rectangle)*size*4+1);
  61.     int i, ns;
  62.  
  63.     for (ns= i= 0; i < size; i++)
  64.         ns+= Difference(&nrl[ns], rl[i], r);
  65.     size= ns+1;
  66.     SafeDelete(rl);
  67.     rl= (Rectangle*) Storage::Alloc(sizeof(Rectangle)*size+100);
  68.     // rl= (Rectangle*) Storage::Alloc(1000);
  69.     memcpy(rl, nrl, sizeof(Rectangle)*ns);
  70.     Freea(nrl);
  71.     } else
  72.     rl= (Rectangle*) Storage::Alloc(sizeof(Rectangle)*1);
  73.     rl[size++]= r;
  74.     bbox.Merge(r);
  75.  
  76. #else
  77.     if (size == 0) {
  78.     rl[size++]= bbox= r;
  79.     return;
  80.     }
  81.     if (r.ContainsRect(bbox)) {
  82.     size= 0;
  83.     rl[size++]= bbox= r;
  84.     return;
  85.     }
  86.     bbox.Merge(r);
  87.     for (int i= 0; i < size; i++) {
  88.     if (rl[i].ContainsRect(r))
  89.         return;
  90.     if (r.ContainsRect(rl[i])) {
  91.         rl[i]= r;
  92.         return;
  93.     } 
  94.     if (r.Intersects(rl[i])) {
  95.         rl[i].Merge(r);
  96.         return;
  97.     }
  98.     }
  99.     if (size >= 20)
  100.     rl[size-1].Merge(r);
  101.     else
  102.     rl[size++]= r;
  103. #endif
  104. }
  105.  
  106.  
  107.